package com.ruoyi.common.core.config;

import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;
import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;
import com.ruoyi.common.core.context.SecurityContextHolder;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.StringValue;
import org.springframework.context.annotation.Configuration;

import java.util.ArrayList;
import java.util.List;

/**
 * @描述: MyBatis 多租户配置
 * @作者: LeiYang
 * @时间: Created in 2022/10/20 12:59
 */
@Configuration
public class MyBatisTenantConfig {

    /**
     * tenant_id 字段名
     */
    public static final String TENANT_FIELD = "company_id";

    /**
     * 有哪些表需要做多租户 这些表需要添加一个字段 ，字段名和TENANT_FIELD对应的值一样
     */
    public static final List<String> TENANT_TABLE = new ArrayList<>();

    static {
        //TENANT_TABLE.add("sys_post");
    }

    /**
     * @方法名: tenantInterceptor
     * @描述: 租户拦截器
     * @作者: LeiYang
     * @时间: Created in 2022/10/20 12:39
     */
    public static TenantLineInnerInterceptor tenantInterceptor() {
        return new TenantLineInnerInterceptor(new TenantLineHandler() {

            /**
             * 获取租户 ID 值表达式，只支持单个 ID 值
             * <p>
             *
             * @return 租户 ID 值表达式
             */
            @Override
            public Expression getTenantId() {
                // 从当前线程变量中获取
                String tenantLocal = SecurityContextHolder.getTenantId();
                return new StringValue(tenantLocal);
            }

            /**
             * 根据表名判断是否忽略拼接多租户条件
             * 默认都要进行解析并拼接多租户条件
             *
             * @param tableName 表名
             * @return 是否忽略, true:表示忽略，false:需要解析并拼接多租户条件
             */
            @Override
            public boolean ignoreTable(String tableName) {
                // 取反设置需要拼租户条件的表
                return !TENANT_TABLE.contains(tableName);
                //return !"sys_post".equalsIgnoreCase(tableName);
            }

            /**
             * 获取租户字段名
             * 默认字段名叫: tenant_id
             *
             * @return 租户字段名
             */
            @Override
            public String getTenantIdColumn() {
                return TENANT_FIELD;
            }
        });
    }
}
